﻿using System;
using System.Collections.Generic;
using System.Linq;
using System.Web;
using System.Web.UI;
using System.Web.UI.WebControls;
using Crosland.Automotriz.Facade.Facade;
using Crosland.Automotriz.Facade.Interface;
using System.Data;
using System.Data.SqlTypes;
using System.IO;
using DevExpress.Web.ASPxGridView.Export;
using System.Windows.Forms;
using Crosland.Automotriz.Core;
using Crosland.Automotriz.Logic.Linq;
using System.Configuration;
using System.Threading;
using Crosland.Automotriz.Logic.ControlExeption;


namespace Crosland.Automotriz.Web.Repuestos
{
    public partial class wFrmManualesPartesVehiculosCargaAvanzada : System.Web.UI.Page
    {
        private clsT_Man_Sistema_ArticuloLogic sistema_articuloLogic = new clsT_Man_Sistema_ArticuloLogic();
        private clsT_Man_SistemaLogic sistemaLogic = new clsT_Man_SistemaLogic();
        private string idNegocio = ConfigurationManager.AppSettings["Negocio"];
        private static DataTable ds = new DataTable();
        private static String RutaExcel = String.Empty;
        private iFacadeSistema BL_Carga_Avanzada = new FacadeSistema();
        private bool RespuestaFinal = true;
        protected void Page_Load(object sender, EventArgs e)
        {
            if (!IsPostBack)
            {
                listadoT_Modelo();
                cargarTableT_Man_Sistema();
            }
            gvExcel.DataSource = ds;
            gvExcel.DataBind();
        }

        private void cargarTableT_Man_Sistema()
        {

            ds.Rows.Clear();
            ds.Columns.Clear();

            DataColumn sistema_bd = new DataColumn();
            sistema_bd.DataType = System.Type.GetType("System.String");
            sistema_bd.ColumnName = "SISTEMA_BD";

            DataColumn nroitem = new DataColumn();
            nroitem.DataType = System.Type.GetType("System.String");
            nroitem.ColumnName = "NROITEM";

            DataColumn sistema = new DataColumn();
            sistema.DataType = System.Type.GetType("System.String");
            sistema.ColumnName = "SISTEMA";

            DataColumn nropagina = new DataColumn();
            nropagina.DataType = System.Type.GetType("System.Int32");
            nropagina.ColumnName = "NROPAGINA";

            DataColumn descripcion_esp = new DataColumn();
            descripcion_esp.DataType = System.Type.GetType("System.String");
            descripcion_esp.ColumnName = "DESCRIPCION_ESP";

            DataColumn descripcion_ing = new DataColumn();
            descripcion_ing.DataType = System.Type.GetType("System.String");
            descripcion_ing.ColumnName = "DESCRIPCION_ING";

            DataColumn partnro = new DataColumn();
            partnro.DataType = System.Type.GetType("System.String");
            partnro.ColumnName = "PARTNRO";

            DataColumn cantidad = new DataColumn();
            cantidad.DataType = System.Type.GetType("System.Int32");
            cantidad.ColumnName = "CANTIDAD";

            DataColumn remark_ing = new DataColumn();
            remark_ing.DataType = System.Type.GetType("System.String");
            remark_ing.ColumnName = "REMARK_ING";

            DataColumn remark_esp = new DataColumn();
            remark_esp.DataType = System.Type.GetType("System.String");
            remark_esp.ColumnName = "REMARK_ESP";

            DataColumn id_sistema = new DataColumn();
            id_sistema.DataType = System.Type.GetType("System.String");
            id_sistema.ColumnName = "ID_SISTEMA";

            ds.Columns.Add(sistema_bd);
            ds.Columns.Add(sistema);
            ds.Columns.Add(nropagina);
            ds.Columns.Add(nroitem);
            ds.Columns.Add(partnro);
            ds.Columns.Add(descripcion_esp);
            ds.Columns.Add(descripcion_ing);
            ds.Columns.Add(cantidad);
            ds.Columns.Add(remark_ing);
            ds.Columns.Add(remark_esp);
            ds.Columns.Add(id_sistema);
            DataRow row = ds.NewRow();
            ds.Rows.Add(row);
            gvExcel.DataSource = ds;



        }

        protected void bntSalir_Click(object sender, EventArgs e)
        {
            Response.Redirect("~/Repuestos/wFrmManualesPartesVehiculosSistemas.aspx?id=" + idNegocio);
        }

        protected void gvExcel_PageIndexChanged(object sender, EventArgs e)
        {
            gvExcel.DataSource = ds;
            gvExcel.DataBind();
        }

        protected void gvExcel_AfterPerformCallback(object sender, DevExpress.Web.ASPxGridView.ASPxGridViewAfterPerformCallbackEventArgs e)
        {
            gvExcel.DataSource = ds;
            gvExcel.DataBind();

        }

        public struct lista
        {
            public string SISTEMA { get; set; }
            public string NRO_PAGINA { get; set; }
            public string NRO_ITEM { get; set; }
            public string COD_MATERIAL { get; set; }
            public string CANTIDAD { get; set; }
            public string REMARK { get; set; }
        }

        public static List<lista> listaGeneralNoInsertados;

        private void listadoT_Modelo()
        {
            cboModelo.DataSource = BL_Carga_Avanzada.listar_filtro_modelo_s();
            cboModelo.TextField = "DES_MODELO";
            cboModelo.ValueField = "ID_MODELO";
            cboModelo.DataBind();
        }

        private void grabarArticulos()
        {
            string cod_material = String.Empty;
            clsT_Man_ArticuloLogic listart_man = new clsT_Man_ArticuloLogic();
            int i = 0;
            bool rptaArticulo = true;

            clsTd_ModeloLogic modelo = new clsTd_ModeloLogic();
            var q = from s in modelo.listar_filtro_S()
                    where s.ID_MODELO == Convert.ToInt32(cboModelo.Value)
                    select s;

            String DesMarca = q.ToList().FirstOrDefault().DES_MARCA;


            while (i < gvExcel.VisibleRowCount)
            {
                T_MAN_ARTICULO t_man_Articulo = new T_MAN_ARTICULO();
                try
                {
                    t_man_Articulo.COD_MATERIAL = gvExcel.GetRowValues(i, "PARTNRO").ToString();
                    t_man_Articulo.NOM_MATERIAL_INGLES = gvExcel.GetRowValues(i, "DESCRIPCION_ING").ToString();
                    t_man_Articulo.NOM_MATERIAL_ESP = gvExcel.GetRowValues(i, "DESCRIPCION_ESP").ToString();
                    t_man_Articulo.IND_ELIMINAR = 0;
                    List<T_MAN_ARTICULO> listado = listart_man.list_consulta(t_man_Articulo.COD_MATERIAL);
                    if (listado != null)
                    {
                        if (listado.Count == 0)
                        {
                            if (DesMarca == "BAJAJ")
                            {

                                if (t_man_Articulo.COD_MATERIAL.Length == 8)
                                {
                                    rptaArticulo = BL_Carga_Avanzada.Insertar_Sistema_Articulos(t_man_Articulo);
                                }
                            }
                            else
                            {

                                rptaArticulo = BL_Carga_Avanzada.Insertar_Sistema_Articulos(t_man_Articulo);
                            }
                            if (rptaArticulo == false)
                            {
                                lblMsj.Text = "Error: " + Globales.msjAplicacion + "\n\r";
                                lblMsj.Text = lblMsj.Text + "Material: " + t_man_Articulo.COD_MATERIAL + " - " + t_man_Articulo.NOM_MATERIAL_ESP;
                                popupMsjGeneral.ShowOnPageLoad = true;
                            }
                        }
                    }
                }
                catch (Crosland.Automotriz.Logic.ControlExeption.DataException ex)
                {
                    GuardarExceptionLog(ex.Message, ex, "grabarArticulos");
                    MensajesError(ex.Message, ex, "grabarArticulos");

                }
                catch (RunException ex)
                {
                    GuardarExceptionLog(ex.Message, ex, "grabarArticulos");
                    MensajesError(ex.Message, ex, "grabarArticulos");
                }
                i = i + 1;
            }
            if (rptaArticulo == false)
            {
                RespuestaFinal = false;
            }
        }

        private void grabart_man_sis_modelo()
        {

            int i = 0;
            clsT_Man_Sistema_ModeloLogic listaSistema_Modelo = new clsT_Man_Sistema_ModeloLogic();
            bool rptaModelo = true;
            while (i < gvExcel.VisibleRowCount)
            {
                T_MAN_SISTEMA_MODELO t_man_sistema_modelo = new T_MAN_SISTEMA_MODELO();
                try
                {
                    t_man_sistema_modelo.ID_SISTEMA = gvExcel.GetRowValues(i, "ID_SISTEMA").ToString() == String.Empty ? 0 : Convert.ToInt32(gvExcel.GetRowValues(i, "ID_SISTEMA"));
                    t_man_sistema_modelo.ID_MODELO = cboModelo.Text == String.Empty ? 0 : Convert.ToInt32(cboModelo.Value);
                    t_man_sistema_modelo.DES_IMAGEN = String.Empty;
                    List<T_MAN_SISTEMA_MODELO> listado = listaSistema_Modelo.consulta_lista(Convert.ToInt32(cboModelo.Value), t_man_sistema_modelo.ID_SISTEMA);
                    if (listado != null)
                    {
                        if (listado.Count == 0)
                        {
                            rptaModelo = BL_Carga_Avanzada.Insertar_T_Man_Sistema_Modelo(t_man_sistema_modelo);
                            if (rptaModelo == false)
                            {
                                lblMsj.Text = "Error: " + Globales.msjAplicacion + "\n\r";
                                lblMsj.Text = lblMsj.Text + "Material: " + gvExcel.GetRowValues(i, "PARTNRO").ToString() + " - " + gvExcel.GetRowValues(i, "DESCRIPCION_ESP").ToString() + "\n\r";
                                lblMsj.Text = lblMsj.Text + "Sistema: " + t_man_sistema_modelo.ID_SISTEMA + " - " + gvExcel.GetRowValues(i, "SISTEMA").ToString();
                                popupMsjGeneral.ShowOnPageLoad = true;
                            }
                        }
                    }
                }
                catch (Crosland.Automotriz.Logic.ControlExeption.DataException ex)
                {
                    GuardarExceptionLog(ex.Message, ex, "grabart_man_sis_modelo");
                    MensajesError(ex.Message, ex, "grabart_man_sis_modelo");

                }
                catch (RunException ex)
                {
                    GuardarExceptionLog(ex.Message, ex, "grabart_man_sis_modelo");
                    MensajesError(ex.Message, ex, "grabart_man_sis_modelo");
                }
                i = i + 1;
            }
            if (rptaModelo == false)
            {
                RespuestaFinal = false;
            }
        }

        private void grabar()
        {
            int ID_MODELO, ID_SISTEMA, NRO_PAGINA, CANTIDAD, i = 0;
            int intNroItemSistema = 0;
            int intIdSistemaTemporal = 0;
            string NRO_ITEM_MANUAL, CODIGO_MATERIAL, REMARK_ING, REMARK_ESP, DES_MATERIAL_INGLES;
            List<T_MAN_SISTEMA_ARTICULO> listaSistemaArticulo;

            clsTd_ModeloLogic modelo = new clsTd_ModeloLogic();
            var q = from s in modelo.listar_filtro_S()
                    where s.ID_MODELO == Convert.ToInt32(cboModelo.Value)
                    select s;

            String DesMarca = q.ToList().FirstOrDefault().DES_MARCA;

            bool rpta = true;
            try
            {
                while (i < gvExcel.VisibleRowCount)
                {

                    ID_MODELO = cboModelo.Text == String.Empty ? 0 : Convert.ToInt32(cboModelo.Value);
                    ID_SISTEMA = gvExcel.GetRowValues(i, "ID_SISTEMA").ToString() == String.Empty ? 0 : Convert.ToInt32(gvExcel.GetRowValues(i, "ID_SISTEMA"));
                    NRO_ITEM_MANUAL = gvExcel.GetRowValues(i, "NROITEM").ToString();
                    NRO_PAGINA = gvExcel.GetRowValues(i, "NROPAGINA").ToString() == String.Empty ? 0 : Convert.ToInt32(gvExcel.GetRowValues(i, "NROPAGINA"));
                    CANTIDAD = gvExcel.GetRowValues(i, "CANTIDAD").ToString() == String.Empty ? 0 : Convert.ToInt32(gvExcel.GetRowValues(i, "CANTIDAD"));
                    CODIGO_MATERIAL = gvExcel.GetRowValues(i, "PARTNRO").ToString();
                    REMARK_ING = gvExcel.GetRowValues(i, "REMARK_ING").ToString();
                    REMARK_ESP = gvExcel.GetRowValues(i, "REMARK_ESP").ToString();
                    DES_MATERIAL_INGLES = gvExcel.GetRowValues(i, "DESCRIPCION_ING").ToString();

                    listaSistemaArticulo = sistema_articuloLogic.consulta_sistema_articulo(ID_MODELO, ID_SISTEMA, CODIGO_MATERIAL, NRO_PAGINA, NRO_ITEM_MANUAL);
                    if (listaSistemaArticulo != null)
                    {
                        if (listaSistemaArticulo.Count == 0)
                        {


                            if (intIdSistemaTemporal != ID_SISTEMA)
                            {
                                intNroItemSistema = 1;
                            }
                            else
                            {

                                intNroItemSistema = intNroItemSistema + 1;
                            }


                            if (DesMarca == "BAJAJ")
                            {
                                if (CODIGO_MATERIAL.Length == 8)
                                {
                                    rpta = sistema_articuloLogic.insertarT_man_sistema_Articulo(ID_MODELO, ID_SISTEMA, CODIGO_MATERIAL, NRO_PAGINA, NRO_ITEM_MANUAL, CANTIDAD, REMARK_ING, REMARK_ESP, intNroItemSistema, DES_MATERIAL_INGLES);

                                }
                            }
                            else
                            {

                                rpta = sistema_articuloLogic.insertarT_man_sistema_Articulo(ID_MODELO, ID_SISTEMA, CODIGO_MATERIAL, NRO_PAGINA, NRO_ITEM_MANUAL, CANTIDAD, REMARK_ING, REMARK_ESP, intNroItemSistema, DES_MATERIAL_INGLES);
                            }
                            if (rpta == false)
                            {
                                lblMsj.Text = lblMsj.Text + "Error Aplicación: " + Globales.msjAplicacion + "\n\r";
                                lblMsj.Text = lblMsj.Text + "Error SQL: " + Globales.msjSql + "\n\r";
                                lblMsj.Text = lblMsj.Text + "Material: " + gvExcel.GetRowValues(i, "PARTNRO").ToString() + " - " + gvExcel.GetRowValues(i, "DESCRIPCION_ESP").ToString() + "\n\r";
                                lblMsj.Text = lblMsj.Text + "Sistema: " + gvExcel.GetRowValues(i, "ID_SISTEMA").ToString() + " - " + gvExcel.GetRowValues(i, "SISTEMA").ToString();
                            }
                        }

                    }

                    intIdSistemaTemporal = ID_SISTEMA;
                    i = i + 1;
                }
                if (rpta == false)
                {
                    RespuestaFinal = false;
                }
            }
            catch (Crosland.Automotriz.Logic.ControlExeption.DataException ex)
            {
                GuardarExceptionLog(ex.Message, ex, "grabar");
                MensajesError(ex.Message, ex, "grabar");

            }
            catch (RunException ex)
            {
                GuardarExceptionLog(ex.Message, ex, "grabar");
                MensajesError(ex.Message, ex, "grabar");
            }
        }

        private void GuardarExceptionLog(String msgUsu, Exception ex, String metError)
        {
            try
            {
                String msgReal, fhError, pagError, codUsu;
                msgReal = (ex.InnerException != null) ? ex.InnerException.Message : ex.Message;
                pagError = new System.IO.FileInfo(Page.Request.Url.AbsolutePath).Name;
                codUsu = Session["User"].ToString();
                fhError = DateTime.Now.ToString("dd/MM/yyyy HH:mm:ss");
                System.Diagnostics.StackTrace trace = new System.Diagnostics.StackTrace(ex, true);
                int number = 0;
                for (int i = 0; i < trace.FrameCount; i++)
                {
                    System.Diagnostics.StackFrame sf = trace.GetFrame(i);
                    number = sf.GetFileLineNumber();
                }
                fhError = DateTime.Now.ToString("dd/MM/yyyy HH:mm:ss");
                new Logg().ErrorLog(Server.MapPath("~/Logs/ErrorLog.csv"), msgUsu, msgReal, pagError, metError, codUsu, number);
            }
            catch (Crosland.Automotriz.Logic.ControlExeption.DataException e)
            {

                MensajesError(e.Message, e, "GuardarExceptionLog");
            }
            catch (RunException re)
            {
                MensajesError(re.Message, re, "GuardarExceptionLog");
            }

        }

        private void MensajesError(String msgUsu, Exception ex, String metError)
        {
            Crosland.Automotriz.Web.UserControl.MensajeError uc = (Crosland.Automotriz.Web.UserControl.MensajeError)Master.FindControl("ucErrorMensaje");
            String msgReal, fhError, pagError, codUsu;
            msgReal = (ex.InnerException != null) ? ex.InnerException.Message : ex.Message;
            pagError = new System.IO.FileInfo(Page.Request.Url.AbsolutePath).Name;
            codUsu = Session["User"].ToString();
            fhError = DateTime.Now.ToString("dd/MM/yyyy HH:mm:ss");
            System.Diagnostics.StackTrace trace = new System.Diagnostics.StackTrace(ex, true);
            int number = 0;
            for (int i = 0; i < trace.FrameCount; i++)
            {
                System.Diagnostics.StackFrame sf = trace.GetFrame(i);
                number = sf.GetFileLineNumber();
            }
            uc.Errores(msgUsu, msgReal, fhError, pagError, metError, codUsu, number);
        }

        private void cargar_Grid(string filePath)
        {
            try
            {
                System.Data.OleDb.OleDbConnectionStringBuilder builder = new System.Data.OleDb.OleDbConnectionStringBuilder();
                builder.DataSource = filePath;
                if (Path.GetExtension(filePath).ToUpper() == ".XLS")
                {
                    builder.Provider = "Microsoft.ACE.OLEDB.12.0";
                    builder.Add("Extended Properties", "Excel 8.0;HRD=Yes;IMEX=1");
                }
                else if (Path.GetExtension(filePath).ToUpper() == ".XLSX")
                {
                    builder.Provider = "Microsoft.ACE.OLEDB.12.0";
                    builder.Add("Extended Properties", "Excel 12.0;HRD=Yes;IMEX=1");
                }
                else
                {
                    return;
                }
                System.Data.OleDb.OleDbConnection oledbConn = new System.Data.OleDb.OleDbConnection(builder.ConnectionString);
                string strSQL = "SELECT SISTEMA_BD,SISTEMA,NROPAGINA,NROITEM,PARTNRO,DESCRIPCION_ESP,DESCRIPCION_ING,CANTIDAD,REMARK_ING,REMARK_ESP,ID_SISTEMA FROM [Carga$] WHERE LEN(PARTNRO)>0";
                System.Data.OleDb.OleDbCommand cmd = new System.Data.OleDb.OleDbCommand(strSQL, oledbConn);
                System.Data.OleDb.OleDbDataAdapter da = new System.Data.OleDb.OleDbDataAdapter(cmd);
                da.Fill(ds);
                oledbConn.Close();
                gvExcel.DataSource = ds;
                gvExcel.DataBind();
                popupMsjGeneral.ShowOnPageLoad = false;
                PopupCargarExcel.ShowOnPageLoad = false;
                for (int i = 0; i < ds.Rows.Count; i++)
                {
                    if (ds.Rows[i]["PARTNRO"].ToString().Trim() != "")
                    {
                        if (ds.Rows[i]["nroitem"].ToString().Trim() == "")
                        {
                            string NROPAGINA = ds.Rows[i]["NROPAGINA"].ToString().Trim();
                            string PARTNRO = gvExcel.GetRowValues(i, "PARTNRO").ToString();
                            btnGrabar.Enabled = false;
                            lblMsj.Text = "El [Número de item] no es reconocido o se encuentra vacío en el archivo excel.\n\r";
                            lblMsj.Text = lblMsj.Text + "PARTNRO: " + PARTNRO + "\n\r";
                            lblMsj.Text = lblMsj.Text + "NROPAGINA: " + NROPAGINA;
                            popupMsjGeneral.ShowOnPageLoad = true;
                            return;
                        }
                    }
                }
                btnGrabar.Enabled = true;
            }
            catch (Crosland.Automotriz.Logic.ControlExeption.DataException ex)
            {
                GuardarExceptionLog(ex.Message, ex, "cargar_Grid");
                MensajesError(ex.Message, ex, "cargar_Grid");

            }
            catch (Exception ex)
            {
                GuardarExceptionLog(ex.Message, ex, "cargar_Grid");
                MensajesError(ex.Message, ex, "cargar_Grid");
            }

        }

        private void ValidaGrabacion()
        {

            if (gvExcel.VisibleRowCount == 0)
            {
                lblMsj.Text = "Debe cargar excel para poder grabar los datos !";
                popupMsjGeneral.ShowOnPageLoad = true;
                return;
            }

            grabarArticulos();
            grabart_man_sis_modelo();
            grabar();

            //if (RespuestaFinal == true)
            //{
            //    lblMsj.Text = "El proceso concluyó satisfactoriamente.";
            //}
            lblMsj.Text = "El proceso concluyó satisfactoriamente.";
            popupMsjGeneral.ShowOnPageLoad = true;
        }

        private void DescargarFormato()
        {
            try
            {
                string filepath = Server.MapPath("\\Archivos Excel\\Formato\\FormatoCargaManualBajaj.XLSX");
                string filename = "FormatoCargaManualBajaj.XLSX";
                Response.Clear();
                Response.ContentType = "application/vnd.ms-excel";
                Response.AddHeader("Content-Disposition", "attachment; filename=" + filename);
                Response.Flush();
                Response.WriteFile(filepath);
                Response.End();
            }
            catch (Crosland.Automotriz.Logic.ControlExeption.DataException ex)
            {
                GuardarExceptionLog(ex.Message, ex, "DescargarFormato");
                MensajesError(ex.Message, ex, "DescargarFormato");

            }
            catch (RunException ex)
            {
                GuardarExceptionLog(ex.Message, ex, "DescargarFormato");
                MensajesError(ex.Message, ex, "DescargarFormato");
            }
        }

        protected void btnImportarArchivo_Click(object sender, EventArgs e)
        {
            ds.Clear();
            if (RutaExcel.Length == 0)
            {
                popupMsjGeneral.ShowOnPageLoad = true;
                lblMsj.Text = "Seleccione un archivo excel para la carga";
                return;
            }

            cargar_Grid(RutaExcel);
            RutaExcel = string.Empty;
        }

        protected void ucArchivo_FileUploadComplete(object sender, DevExpress.Web.ASPxUploadControl.FileUploadCompleteEventArgs e)
        {
            if (e.IsValid)
            {
                string filePath = Server.MapPath("~/Archivos Excel/" + e.UploadedFile.FileName);
                e.UploadedFile.SaveAs(filePath);
                RutaExcel = filePath;
            }
        }

        protected void btnGrabar_Click(object sender, EventArgs e)
        {
            this.ValidaGrabacion();
        }

        protected void btnPopFormato_Click(object sender, EventArgs e)
        {
            this.DescargarFormato();
        }

    }
}